﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Csharpzuoye
{
    //2.观察一起帮的求助（Problem）、文章（Article）和意见建议（Suggest），根据他们的特点，抽象出一个父类：内容（Content）
    //1.）Content中有一个字段：kind，记录内容的种类（problem/article/suggest等），只能被子类使用
    //2.）确保每个Content对象都有kind的非空值
    //3.）Content中的createTime，不能被子类使用，但只读属性PublishTime使用它为外部提供内容的发布时间
    //4.）其他方法和属性请自行考虑，尽量贴近一起帮的功能实现。

    //抽象类和接口
    //1.思考之前的Content类，该将其抽象成抽象类还是接口？为什么？并按你的想法实现。 抽象类：既有字段也有方法
    //2.一起帮里的求助总结（Summary，注意不是求助Problem）、文章和意见建议，以及他们的评论，
    //都有一个点赞（Agree）/踩（Disagree）的功能，赞和踩都会增减作者及评价者的帮帮点。能不能对其进行抽象？如何实现？ 
    //3. 引入两个子类EmailMessage和DBMessage，和他们继承的接口ISendMessage（含Send()方法声明），用Console.WriteLine()实现Send()。
    //4.一起帮还可以在好友间发私信，所有又有了IChat接口，其中也有一个Send()方法声明。假设User类同时继承了ISendMessage和IChat，如何处理？ 

    //反射和特性
    //1.之前的Content类，其中的CreateTime（创建时间）和PublishTime（发布时间）都是只读的属性，  想一想他们应该在哪里赋值比较好，并完成相应代码
    //2.在Content之外封装一个方法，可以修改Content的CreateTime和PublishTime

    //异常
    //1.修改之前的属性验证：problem.Reward为负数时直接抛出“参数越界”异常
    //2.内容（Content）发布（Publish）的时候检查其作者（Author）是否为空，如果为空抛出“参数为空”异常
    //3在ContentService中捕获异常
    //    如果是“参数为空”异常，Console.WriteLine() 输出：内容的作者不能为空，将当前异常封装进新异常的InnerException，再将新异常抛出
    //     如果是“”参数越界”异常，Console.WriteLine() 输出：求助的Reward为负数（-XX），不再抛出异常
    //4.ContentService中无论是否捕获异常，均要Console.WriteLine() 输出：XXXX年XX月XX日 XX点XX分XX秒（当前时间），请求发布内容（Id=XXX）
    //在Main()函数调用ContentService时，捕获一切异常，并记录异常的消息和堆栈信息

    //关联对象作业
    //观察一起帮的功能，思考并
    //Email和User有一对一的关系，参照课堂演示，在数据库上建立User外键引用Email的映射
    //按继承映射：Problem/Article/Suggest以及他们的父类Content
    public class Content : Entity
    {
        public IList<Problem> Problems { get; set; }
        public IList<Article> Articles { get; set; }
        public IList<Suggest> Suggests { get; set; }

        protected string kind;
        private DateTime createTime;
        private DateTime publishTime;
        public Content Author { get; set; }

        public Content(string kind)/* : base()*/
        {
            createTime = DateTime.Now;
            this.kind = kind;
        }
        public Content()
        {

        }

        public DateTime PublishTime
        {
            protected set;
            get;
        }
        public DateTime CreateTime
        {
            private set;
            get;
        }

        //2.内容（Content）发布（Publish）的时候检查其作者（Author）是否为空，如果为空抛出“参数为空”异常
        public virtual void Publish( )
        {
            if (Author == null)
            {
                throw new NullReferenceException("发布文章的作者为空");
            }
            else
            {
                Console.WriteLine();
            }
        }


    }

}
